package carvajal.dane.web;

import carvajal.dane.bl.EncuestaFacade;
import carvajal.dane.bl.PreguntaFacade;
import carvajal.dane.bl.TipopreguntaFacade;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import carvajal.dane.entidades.Encuesta;
import carvajal.dane.entidades.Opcionrespuesta;
import carvajal.dane.entidades.Pregunta;
import carvajal.dane.entidades.Tipopregunta;
import carvajal.framework.utilidades.excepcion.FrameworkException;
import carvajal.framework.utilidades.web.FacesUtils;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.component.UIData;
import javax.faces.event.PhaseId;
import javax.faces.event.ValueChangeEvent;

@ManagedBean(name = "encuestaBean")
@SessionScoped
public class EncuestaBean {

    private Date fecha;
    private String nombreEncuesta;
    private String pregunta;
    private String tipoPregunta;
    private Map<String, String> itemsTipoPregunta;
    private List<Opcionrespuesta> listaOpciones;
    private String textoRespuesta;
    private HtmlDataTable tabla;
    private HtmlDataTable tablaPreguntas;
    private Boolean mostrarOpciones = new Boolean(true);
    private List<Pregunta> listaPreguntas;
    private Boolean mostrarPreguntas;
    @EJB
    private EncuestaFacade ejbFacadeEncuesta;
    
    @EJB
    private PreguntaFacade ejbFacadePregunta;
    
    @EJB
    private TipopreguntaFacade ejbFacadeTipoPregunta;
    
    private String tipoPreguntaAbierta;
    private String RECURSOS = "/resources";
    
    private boolean control;

    public EncuestaBean() {
        try {
			this.tipoPregunta = "0";
			this.mostrarOpciones = false;
			this.textoRespuesta = "";
			this.control = true;
			tipoPreguntaAbierta = ResourceBundle.getBundle(RECURSOS).getString("encuesta.crear.preguntaAbierta");
		} catch (Exception e) {
			e.printStackTrace();
		}
    }

    public boolean isControl() {
		return control;
	}

	public void setControl(boolean control) {
		this.control = control;
	}
    
    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setNombreEncuesta(String nombreEncuesta) {
        this.nombreEncuesta = nombreEncuesta;
    }

    public String getNombreEncuesta() {
        return nombreEncuesta;
    }

    public void setPregunta(String pregunta) {
        this.pregunta = pregunta;
    }

    public String getPregunta() {
        return pregunta;
    }

    public void setTipoPregunta(String tipoPregunta) {
        this.tipoPregunta = tipoPregunta;
    }

    public String getTipoPregunta() {
        return tipoPregunta;
    }

    public void setItemsTipoPregunta(HashMap<String, String> itemsTipoPregunta) {
        this.itemsTipoPregunta = itemsTipoPregunta;
    }

    public Map<String, String> getItemsTipoPregunta() {
        itemsTipoPregunta = new HashMap<String, String>();        
        itemsTipoPregunta.put("-Seleccione-", "0");
        
        List<Tipopregunta> tipoPreguntaList = getTipoPreguntaFacade().findAll();
        
        for (Iterator<Tipopregunta> it = tipoPreguntaList.iterator(); it.hasNext();) {
            Tipopregunta tipopregunta = it.next();
            itemsTipoPregunta.put(tipopregunta.getDescripcion(), tipopregunta.getIdtipopregunta().toString());
        }
        
        itemsTipoPregunta = new TreeMap<String, String>(itemsTipoPregunta);
        
        return itemsTipoPregunta;
    }

    public void setListaOpciones(List<Opcionrespuesta> listaOpciones) {
        this.listaOpciones = listaOpciones;
    }

    public List<Opcionrespuesta> getListaOpciones() {
        return listaOpciones;
    }

    public void setTextoRespuesta(String textoRespuesta) {
        this.textoRespuesta = textoRespuesta;
    }

    public String getTextoRespuesta() {
        return textoRespuesta;
    }

    public List<Opcionrespuesta> getListaFalsa() {
        List<Opcionrespuesta> listaFalsa = new ArrayList<Opcionrespuesta>();
        listaFalsa.add(new Opcionrespuesta());
        return listaFalsa;
    }

    public void setTabla(HtmlDataTable tabla) {
        this.tabla = tabla;
    }

    public HtmlDataTable getTabla() {
        return tabla;
    }

    public void agregarOpcionRespuesta(ActionEvent event) {
        //Valida que se escribio texto en la respuesta
        
        if (!(getTextoRespuesta() != null && getTextoRespuesta().trim().length() > 0)) {
            FacesUtils.addErrorMessage(ResourceBundle.getBundle(RECURSOS).getString("encuesta.respuesta.obligatorio"));
            return;
        }
        
        if (!(listaOpciones != null && listaOpciones.size() > 0)) {
            listaOpciones = new ArrayList<Opcionrespuesta>();
        }

        Opcionrespuesta opcion = new Opcionrespuesta();
        opcion.setTextorespuesta(getTextoRespuesta());
        listaOpciones.add(opcion);
        setTextoRespuesta("");
        this.control = !this.control;
    }

    public void eliminarOpcionRespuesta(ActionEvent event) {
        try {
                final UIData uiData = (UIData) event.getComponent()
                                .getParent().getParent();
                final int fila = uiData.getRowIndex();
                if (listaOpciones != null && listaOpciones.size() > 0) {
                        listaOpciones.remove(fila);
                }
        } catch (Exception e) {
                e.printStackTrace();
        }
    }

    public void eliminarPregunta(ActionEvent event) {
        try {
                final UIData uiData = (UIData) event.getComponent()
                                .getParent().getParent();
                final int fila = uiData.getRowIndex();
                if (listaPreguntas != null && listaPreguntas.size() > 0) {
                        listaPreguntas.remove(fila);
                }
        } catch (Exception e) {
                e.printStackTrace();
        }
    }

    public void comprobarTipoPregunta(final ValueChangeEvent valueChangeEvent) {
        try {
                if (valueChangeEvent.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
                        valueChangeEvent.setPhaseId(PhaseId.INVOKE_APPLICATION);
                        valueChangeEvent.queue();
                } else {
                        this.listaOpciones = new ArrayList<Opcionrespuesta>();
                        this.mostrarOpciones = this.tipoPregunta.equals("0") || this.tipoPregunta.equals(tipoPreguntaAbierta) ? false
                                        : true;
                        this.textoRespuesta = "";
                }
        } catch (Exception e) {
                e.printStackTrace();
        }
    }

    public void setMostrarOpciones(Boolean mostrarOpciones) {
        this.mostrarOpciones = mostrarOpciones;
    }

    public Boolean getMostrarOpciones() {
        return mostrarOpciones;
    }

    public void guardarPregunta(ActionEvent event) {
        try {
            //Verifica el dato obligatorio...
            if (!(getPregunta() != null && getPregunta().trim().length() > 0)) {
                FacesUtils.addErrorMessage(ResourceBundle.getBundle(RECURSOS).getString("encuesta.pregunta.obligatorio"));
                return;
            }
            
            //Valida que si no es pregunta abierta, se le ha agregado por lo menos una opcion;
            if (!(this.tipoPregunta.equals("0") || this.tipoPregunta.equals(tipoPreguntaAbierta))
                    && !(getListaOpciones() != null && getListaOpciones().size() > 0)) {
                FacesUtils.addErrorMessage(ResourceBundle.getBundle(RECURSOS).getString("encuesta.opciones.obligatorio"));
                return;
            }
            
            if (!(listaPreguntas != null && listaPreguntas.size() > 0)) {
                listaPreguntas = new ArrayList<Pregunta>();
            }

            Pregunta preguntaNueva = new Pregunta();
            preguntaNueva.setTextopregunta(getPregunta());
            
            Iterator it = this.itemsTipoPregunta.entrySet().iterator();
            while (it.hasNext()) {
                    Map.Entry e = (Map.Entry) it.next();
                    if (((String) e.getValue()).equals(this.tipoPregunta)) {
                        Tipopregunta tipPreg = new Tipopregunta();
                        tipPreg.setDescripcion((String) e.getKey());
                        tipPreg.setIdtipopregunta(new Long((String) e.getValue()));
                        preguntaNueva.setIdtipopregunta(tipPreg);
                        break;
                    }
            }
            preguntaNueva.setOpcionrespuestaList(getListaOpciones());
            listaPreguntas.add(preguntaNueva);
            setListaOpciones(null);
            setPregunta("");
            setTipoPregunta("0");
            this.mostrarOpciones = this.tipoPregunta.equals("0") ? false : true;
            this.textoRespuesta = "";
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void setListaPreguntas(List<Pregunta> listaPreguntas) {
        this.listaPreguntas = listaPreguntas;
    }

    public List<Pregunta> getListaPreguntas() {
        return listaPreguntas;
    }

    public void setMostrarPreguntas(Boolean mostrarPreguntas) {
        this.mostrarPreguntas = mostrarPreguntas;
    }

    public Boolean getMostrarPreguntas() {
        if (listaPreguntas != null && listaPreguntas.size() > 0) {
            return true;
        } else {
            return false;
        }
    }

    public void setTablaPreguntas(HtmlDataTable tablaPreguntas) {
        this.tablaPreguntas = tablaPreguntas;
    }

    public HtmlDataTable getTablaPreguntas() {
        return tablaPreguntas;
    }

    public void guardarEncuesta(ActionEvent event) {
        Encuesta encuesta = new Encuesta();
        //encuesta.setIdencuesta(new Long(1));
        encuesta.setNombreencuesta(getNombreEncuesta());
        
        for (Pregunta preguntaTMP : listaPreguntas) {
            List <Opcionrespuesta> listaTMP = preguntaTMP.getOpcionrespuestaList();
            for (Opcionrespuesta opcionrespuesta : listaTMP) {
                opcionrespuesta.setIdpregunta(preguntaTMP);
            }
        }
        
        encuesta.setPreguntaList(listaPreguntas);

        try {
            for (Iterator<Pregunta> it = listaPreguntas.iterator(); it.hasNext();) {
                Pregunta preguntaTMP = it.next();
                getPreguntaFacade().create(preguntaTMP);
            }
            
            
            getEncuestaFacade().create(encuesta);

            //Se limpian los campos
            setNombreEncuesta("");
            setListaPreguntas(null);

            //FacesUtils.addInfoMessage(FacesUtils.getMensaje(RECURSOS, "encuesta.correcto"));
            FacesUtils.addInfoMessage(ResourceBundle.getBundle(RECURSOS).getString("encuesta.correcto"));
        } catch (Exception e) {
            e.printStackTrace();
            try {
//                FacesUtils.addInfoMessage(FacesUtils.getMensaje(RECURSOS, "encuesta.error"));
                FacesUtils.addInfoMessage(ResourceBundle.getBundle(RECURSOS).getString("encuesta.error"));
            } catch (Exception ex) {
                Logger.getLogger(EncuestaBean.class.getName()).log(Level.SEVERE, null, ex);
            }
         }
    }

    private EncuestaFacade getEncuestaFacade() {
        return ejbFacadeEncuesta;
    }
    
    private PreguntaFacade getPreguntaFacade() {
        return ejbFacadePregunta;
    }
    
    private TipopreguntaFacade getTipoPreguntaFacade() {
        return ejbFacadeTipoPregunta;
    }
    
    
}